// 模块导入
import database from '../../utils/database';
import bcrypt from 'bcryptjs';

// 数据库中用户表的表名
const tableName = 'users';
// 定义用户信息接口
interface UserInfo {
    id: number;
    username: string;
    role: 'normal' | 'admin';
}
// 用户服务类
export class UserService {
    // 登录方法
    static login(username: string, password: string): Promise<UserInfo> {
        return new Promise((resolve, reject) => {
            // 读取数据库中的用户数据
            database.queryData(tableName, ['id', 'username', 'role', 'password'], `username = '${username}'`, (data) => {
                // DB 返回的是数组，直接取其中一个即可（只有一个元素）
                let result = data?.result.pop();
                // 如果用户数据存在，则进行后续验证
                if (result) {
                    let databasePassword = result.password;
                    // 验证密码
                    let success = bcrypt.compareSync(password, databasePassword);
                    if (success) {
                        database.updateData(tableName, 'last_login_time=NOW()', `id=${result.id}`);
                        // 登录成功，返回用户数据
                        resolve({
                            id: result.id,
                            username: result.username,
                            role: result.role
                        });
                    } else {
                        reject('密码错误，请重新输入');
                    }
                } else {
                    reject('请输入正确的账户信息');
                }
            });
        });
    }

    // 注册方法
    static signUp(username: string, password: string, role: string): Promise<null> {
        return new Promise((resolve, reject) => {
            // 检查是否已经有用户存在
            database.queryData(tableName, ['id'], `username = ${username}`, (data) => {
                let result = data?.result.pop();
                // 如果用户已经存在，则不能重复注册
                if (result) {
                    reject('用户名已存在，请更换其他用户注册');
                } else {
                    // 对密码进行加密
                    let crypt = bcrypt.hashSync(password, 10);
                    // 将密码加密后的用户数据存储到数据库中
                    database.insertData(tableName, ['username', 'password', 'role'], [username, crypt, role], (data) => {
                        if (data) {
                            resolve(null);
                        } else {
                            reject('注册失败，请稍后重试');
                        }
                    });
                }
            });
        });
    }
}

